package edu.rjh.reflection.reflection_3;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;

public class Test {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        Class<?> clazz = Class.forName("edu.rjh.reflection.reflection_3.Student");

        //获取所有的方法对象（包括父类中所有的公共方法）
//        Method[] methods = clazz.getMethods();
//        for (Method method : methods) {
//            System.out.println(method);
//        }


        //获取所有的方法对象（包括父类中所有的公共方法）
//        Method[] methods = clazz.getDeclaredMethods();
//        for (Method method : methods) {
//            System.out.println(method);
//        }

        //获取指定的单一方法
        Method eat = clazz.getDeclaredMethod("eat", String.class);
        System.out.println(eat);


        //获取方法的修饰符
        int modifiers = eat.getModifiers();
        System.out.println(modifiers);

        //获取方法的名字
        String name = eat.getName();
        System.out.println(name);

        //获取方法的形参
        Parameter[] parameters = eat.getParameters();
        for (Parameter parameter : parameters) {
            System.out.println(parameter);
        }

        //获取方法抛出的异常
        Class<?>[] exceptionTypes = eat.getExceptionTypes();
        for (Class<?> exceptionType : exceptionTypes) {
            System.out.println(exceptionType);
        }

        //方法运行
        Student student = new Student();
        eat.setAccessible(true);
        String invoke = (String) eat.invoke(student, "鸡腿");
        System.out.println(invoke);
    }
}
